package Mediator;

import java.util.ArrayList;
import java.util.List;

//中介者模式

/**
 * 模式的应用场景:
 * 前面分析了中介者模式的结构与特点，下面分析其以下应用场景。
     * - 当对象之间存在复杂的网状结构关系而导致依赖关系混乱且难以复用时。
     * - 当想创建一个运行于多个类之间的对象，又不想生成新的子类时。
 *
 * 模式的扩展:
 * 在实际开发中，通常采用以下两种方法来简化中介者模式，使开发变得更简单。
     * - 不定义中介者接口，把具体中介者对象实现成为单例。
     * - 同事对象不持有中介者，而是在需要的时f矣直接获取中介者对象并调用。
 */
public class MediatorPattern {
    public static void main(String[] args) {
        Mediator mediator = new ConcreteMediator();//创建中介
        Colleague colleague1 = new ConcreteColleagueA();//同事A
        Colleague colleague2 = new ConcreteColleagueB();//同事B
        Colleague colleague = new ConcreteColleagueA();//同事A2
        //注册
        mediator.register(colleague1);
        mediator.register(colleague2);
        mediator.register(colleague);
        //发送请求
        colleague1.send();
        System.out.println("----------------");
        colleague2.send();
        System.out.println("----------------");
        colleague.send();


    }
}
//抽象中介者
abstract class Mediator{
    public abstract void register(Colleague colleague);//注册同事类
    public abstract void relay(Colleague cl);//向同时发送消息
}
//具体中介者
class ConcreteMediator extends Mediator{
    //同事列表
    private List<Colleague> colleagues = new ArrayList<Colleague>();


    @Override
    public void register(Colleague colleague) {
        if (!colleagues.contains(colleague))
        {
            colleagues.add(colleague);//添加新的同事实例
            colleague.setMedium(this);//同事实例设置中介者
        }
    }
    //转发
    @Override
    public void relay(Colleague cl) {
        for (Colleague obj:colleagues){
            if (!obj.equals(cl)){
                ((Colleague)obj).receive();//其他同事实例接收请求
            }
        }
    }
}
//抽象同事类
abstract class Colleague{
    protected Mediator mediator;//中介
    public void setMedium(Mediator mediator){
        this.mediator = mediator;
    }
    //接收请求
    public abstract void send();
    public abstract void receive();
}
//具体同事类
class ConcreteColleagueA extends Colleague{

    @Override
    public void send() {
        System.out.println("具体同事A发送信息");
        mediator.relay(this);//转发
    }

    @Override
    public void receive() {
        System.out.println("具体同事A接收请求");

    }
}
class ConcreteColleagueB extends Colleague{

    @Override
    public void send() {
        System.out.println("具体同事B发送信息");
        mediator.relay(this);//转发
    }

    @Override
    public void receive() {
        System.out.println("具体同事B接收请求");

    }
}














